import tensorflow as tf
import matplotlib.pyplot as plt

# 导入数据集
fashion_mnist = tf.keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
# 创建数据集
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

# 预处理数据
plt.figure()  # 创建一个绘图窗口
plt.imshow(train_images[0])  # 把图片放入绘图窗口
plt.colorbar()  # 添加颜色条,运行后图片右侧会出现一个细长的颜色条
plt.grid(False)  # 关闭网格线
plt.show()  # 显示绘图窗口,这一步才真正显示图片

# 思路:
# 1,看到右侧的颜色条,发现图片的像素值是0~255的整数.
# 2,我们需要把像素值缩放到0~1之间,这样更适合训练.
train_images = train_images / 255.0
test_images = test_images / 255.0

# 创建一个 5 行 5 列的子图网格，figsize 设置窗口大小为 10 x 10 像素
# fig 表示整个绘图窗口，axes 表示子图网格
fig, axes = plt.subplots(5, 5, figsize=(10, 10))
'''
axes = tf.reshape(axes, (25,))
# 把元素拉平，这样写完全可以，扁平化节省计算，但是用 row 和 col 更能体现出网格的结构，只能说各有利弊。
'''
# 这里使用了 row 和 col 的方法。
for i in range(25):
    # 计算当前行列索引
    row = i // 5  # 取整，得到行索引，比如 1//5 = 0 , 2//5 = 0
    col = i % 5  # 取模，得到列索引，比如 1%5 = 1 , 2%5 = 2
    ax = axes[row, col]  # 选择子图

    ax.imshow(train_images[i], cmap=plt.cm.binary)  # 把图片放入子图，cmap 设置颜色映射为黑白

    ax.set_xticks([])  # 关闭 x 轴刻度
    ax.set_yticks([])  # 关闭 y 轴刻度
    ax.grid(False)  # 关闭网格线

    ax.set_xlabel(class_names[train_labels[i]])  # 给图片的x轴添加标签，就是在图片的下方添加了文字说明

plt.show()  # 显示绘图窗口
